class CircularList:  
    def __init__(self, initial):
        self.initial = [x for x in initial]
        self.size = len(self.initial)
        self.reset()

    def __len__(self):
        return self.size

    def __getitem__(self, i):
        return self.data[(self.p + i) % self.size]

    def __setitem__(self, i, value):
        self.data[(self.p + i) % self.size] = value

    def reset(self):
        self.p = 0
        self.data = [x for x in self.initial]

    def pushFront(self, value):
        if not self.size: return
        self.p = (self.p - 1) % self.size
        self.data[self.p] = value
        
    def pushBack(self, value):
        self.data[self.p] = value
        self.p = (self.p + 1) % self.size
        
    def __iter__(self):
        iterStart = self.p
        iterCount = 0
        while iterCount < self.size:
            yield self.data[(iterStart + iterCount) % self.size]
            iterCount += 1

class Player:
    name = ""
    handicap = 1.0
    
    # starts a new game with this player
    def reset(self):
        raise NotImplementedError

    # returns the player's current move choice
    def move(self):
        raise NotImplementedError
    
    # informs the player of a round's move results
    def tell(self, own, oth):
        raise NotImplementedError
